package com.example.myscan;

import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.FileProvider;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.google.gson.Gson;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.File;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {
    private Button btn_scan;
    public static final int TAKE_PHOTO = 1;// 系统相机

    // 身份证图片的uri
    private Uri Imageuri;
    // 存储身份证图片
    private File outputImage;
    // 身份证文字识别结果
    private IdentifyResult result;
    private TextView textView;
//    /**
//     * 图片转成string
//     *
//     * @param bitmap
//     * @return
//     */
//    public static String convertIconToString(Bitmap bitmap) {
//        ByteArrayOutputStream baos = new ByteArrayOutputStream();// outputstream
//        bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
//        byte[] bytes = baos.toByteArray();// 转为byte数组
//        return Base64.encodeToString(bytes, Base64.DEFAULT);
//
//    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_scan = (Button) findViewById(R.id.btn1);
//        picture = (ImageView) findViewById(R.id.picture);
        textView = (TextView) findViewById(R.id.tv1);


        btn_scan.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //创建File对象，用于存储拍照后的图片
                outputImage=new File(getExternalCacheDir(),"output_image.jpg");
                try {
                    if(!outputImage.exists()){//照片不存在
                        outputImage.createNewFile();//重新创建文件
                    }
                }catch (IOException e){
                    e.printStackTrace();
                }
                // 根据Android版本选择对应的uri
                if (Build.VERSION.SDK_INT>=24){
                    Imageuri= FileProvider.getUriForFile(MainActivity.this,
                            "com.example.myscan.fileprovider",outputImage);
                }else {
                    Imageuri= Uri.fromFile(outputImage);
                }
                // 启用相机
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//捕获图片
                intent.putExtra(MediaStore.EXTRA_OUTPUT,Imageuri);
                launcher.launch(intent);
            }
        });
    }

    // 处理相机拍照后的回调（通过嵌套调用下面的各种方法来输出身份证中的文字信息）
    public ActivityResultLauncher<Intent> launcher = registerForActivityResult(
            new ActivityResultContracts.StartActivityForResult(),
            new ActivityResultCallback<ActivityResult>(){
                @Override
                public void onActivityResult(ActivityResult result) {
                    if (result.getResultCode() == Activity.RESULT_OK){
                        //使用身份证识别接口IdCardDetails获取handler中解析的身份证信息
                        IdCardDetails(getHandler_IdCard);

                    }
                }
            });

    // 处理身份证识别结果
    Handler getHandler_IdCard = new Handler(){
        // 接收msg作为参数处理消息
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            // 将request请求转换为string
            String str=msg.getData().getString("request");
            // 解析为JSONObject对象
            JSONObject jsonObject=null;
            try {
                jsonObject=new JSONObject(str);
            }catch (JSONException e){
                e.printStackTrace();
            }
            // 解析身份证文字识别结果，存入textView中
            try {
                // 通过jsonObject获取response请求，然后调用fromJson方法将其解析为IdentifyResult对象
                result=new Gson().fromJson(jsonObject.get("Response").toString(),IdentifyResult.class);
                // 将IdentifyResult对象转换为字符串存入textview中
                textView.setText(getString(result));
            }catch (JSONException e){
                e.printStackTrace();
            }
        }
    };



    /**
     * 身份证扫描结果
     */
    public void IdCardDetails(final Handler handler){
        String str = null;
        if (outputImage.exists()) {
            str = outputImage.toString();
            toast("找到身份证扫描图片:"+str);
        } else {
            toast("找不到身份证扫描图片");
            return;
        }
        //利用腾讯云V3签名算法封装图片，将封装后的数据上传至腾讯云服务器，再获得服务器返回数据
        TecentHttpUtil.getIdCardDetails(str,
                new TecentHttpUtil.SimpleCallBack() {
                    @Override
                    public void Succ(String result) {
                        Message message=new Message();
                        Bundle bundle=new Bundle();
                        bundle.putString("request",result);
                        message.setData(bundle);
                        handler.sendMessage(message);
                        toast("身份证识别成功！");
                    }

                    @Override
                    public void error() {
                        toast("身份证识别错误！");
                    }
                });
    }

    // 获取身份证的各种文字信息并输出
    public String getString(IdentifyResult result){
        String str=result.getName()+"\n\n"+result.getSex()+"\n\n"
                +result.getNation()+"\n\n" +result.getBirth()+"\n\n"
                +result.getAddress()+"\n\n"+result.getId()+"\n\n";
        return str;
    }

    // 将身份证中的文字读取结果以弹窗的形式短暂地显示在应用页面上
    public void toast(String str) {
        Toast.makeText(getApplicationContext(), str, Toast.LENGTH_SHORT).show();
    }

}